/* eslint-disable @typescript-eslint/no-explicit-any */
import { useUserStore } from "@/stores";
import axios, { AxiosError, type Method } from "axios";
import { useRouter } from "vue-router";
import { message } from "ant-design-vue";
import router from "@/router";

const instance = axios.create({
  // 1. 基础地址，超时时间
  baseURL: "/api",
  timeout: 10000,
});

instance.interceptors.request.use(
  (config) => {
    // 2. 携带token
    const store = useUserStore();
    if (store.user?.token && config.headers) {
      config.headers.Authorization = store.user.token;
    }

    return config;
  },
  (err) => Promise.reject(err),
);

instance.interceptors.response.use(
  (res) => {
    // 3. 处理业务失败
    // 后台约定，响应成功，但是code不是10000，是业务逻辑失败
    if (res.data.code !== 10000) {
      // 错误提示
      message.success(res.data.message || "业务失败");
      // 返回错误的promise
      // 传入code将来catch的时候可以使用(res.data包含code)
      return Promise.reject(res.data);
    }
    // 4. 摘取核心响应数据
    return res.data;
  },
  (err: AxiosError) => {
    // 5. 处理401错误
    if (err.response?.status === 401) {
      // 删除用户信息
      const store = useUserStore();
      store.delUser();
      // 跳转登录，带上接口失效所在页面的地址，登录完成后回跳使用
      router.push({
        path: "/login",
        query: { returnUrl: router.currentRoute.value.fullPath },
      });
    }
    return Promise.reject(err);
  },
);

export default instance;

// 请求工具函数
type Data<T> = {
  code: number;
  message: string;
  content: T;
};
export const request = <T>(url: string, method: Method = "GET", submitData?: object) => {
  // 参数：地址，请求方式，提交的数据
  // 返回：promise
  return instance.request<any, Data<T>>({
    url,
    method,
    [method.toUpperCase() === "GET" ? "params" : "data"]: submitData,
  });
};
